Code Smell - Booleano ternários
#public #codesmell
Booleanos que podem ser nulos são code smell.
Não use booleanos para variáveis que podem assumir três valores diferentes (tri-state boolean).
Exemplo de código ruim, onde quem chama a função precisa conhecer a implementação para saber o que acontece em cada caso:
def update_opt_out(user: User, value: bool | None = None):
if value is True:
user.opt_out_at = datetime.utcnow()
elif value is False:
user.opt_out_at = None
elif value is None:
... # do nothing
Invés disso use uma enumeração e dê nomes claros para cada caso, exemplo:
class OptOutAction:
SET_OPT_OUT = 1
CLEAR_OPT_OUT = 2
KEEP_PREVIOUS_OPT_OUT = 3
def update_opt_out(
user: User,
value: OptOutAction = OptOutAction.KEEP_PREVIOUS_OPT_OUT
):
if value == OptOutAction.SET_OPT_OUT:
user.opt_out_at = datetime.utcnow()
elif value == OptOutAction.CLEAR_OPT_OUT:
user.opt_out_at = None
elif value == KEEP_PREVIOUS_OPT_OUT:
... # do nothing